package com.kuang.controller;

import com.google.gson.Gson;
import com.kuang.common.exception.KuangShenException;
import com.kuang.config.WxConstantProperties;
import com.kuang.entity.WeiXinUser;
import com.kuang.handler.jwt.JwtService;
import com.kuang.service.WeiXinUser.WeXinUserServiceImpl;
import com.kuang.utils.HttpClientUtils;
import com.kuang.vo.WeixinDataVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName LoginController
 * @Author ：xuke
 * @Date ：2021/1/17 12:59
 * @Description：
 * @Version: 1.0
 */
@RestController
@Slf4j
public class WeixinController {
    @Autowired
    private WeXinUserServiceImpl weXinUserService;

    @Autowired
    private  JwtService jwtService;

//    @Autowired
//    private WxMaService wxMaService;

    /**
     * 微信登陆
     * @param
     * @return
     */
    @GetMapping("/wxlogin")
    public WeixinDataVo weixinlogin(WeixinDataVo weixinDataVo) {
        // 1：判断code是否合法
        String code=weixinDataVo.getCode();
        if (StringUtils.isEmpty(code)) {
            throw new KuangShenException(22008, "登录失败，尝试刷新重新扫码登录!");
        }

        // 2：通过code和appid和secret组装请求微信服务器的地址
        String loginUrl = "https://api.weixin.qq.com/sns/jscode2session" +
                "?appid=%s" +
                "&secret=%s" +
                "&js_code=%s" +
                "&grant_type=authorization_code";

        String loginResult = null;
        try {
            // 3：执行请求，获取微信请求返回得数据
            loginResult = new HttpClientUtils().get(String.format(loginUrl, WxConstantProperties.WX_OPEN_APP_ID, WxConstantProperties.WX_OPEN_APP_SECRET, code));
            log.info("2---->微信返回的日志信息是：code:{},result：{}", code, loginResult);
        } catch (Exception e) {
            throw new KuangShenException(22007, "登录失败，尝试刷新重新扫码登录!");
        }

        // 4： 对微信返回得数据进行转换
        Gson gson = new Gson();
        Map<String, Object> resultMap = gson.fromJson(loginResult, HashMap.class);
        log.info("3---->微信返回的日志信息是：code:{}，resultMap：{}", code, resultMap);
        // 5: 解析微信用户得唯一凭证openid
        String openid = (String) resultMap.get("openid");
        if (StringUtils.isEmpty(openid)) {
            throw new KuangShenException(22009, "登录失败，尝试刷新重新扫码登录!!!");
        }

       //6：什么是openid：是小程序给每个用户生成的唯一用户标识，在开发中我们可以拿标识做为用户的唯一票据。直接使用openid判断一个用户是否被注册，
       // - 如果注册：直接根据openid查询用户信息，然后生成token返回，
       // - 如果没有没有注册：就进行用户的注册，并且生成token然后进行返回
        weixinDataVo.setOpenid(openid);
        WeiXinUser weiXinUser = weXinUserService.saveWeiXinUser(weixinDataVo);

        if(weiXinUser!=null){
            weixinDataVo.setUserId(weiXinUser.getId());
            weixinDataVo.setNickName(weiXinUser.getUsername());
            String token = jwtService.tokenwx(weixinDataVo);
            weixinDataVo.setToken(token);
            return  weixinDataVo;
        }
        return null;
    }


//    @GetMapping("/wxlogin2")
//    public WeixinDataVo weixinlogins(WeixinDataVo weixinDataVo) throws WxErrorException {
//        WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(weixinDataVo.getCode());
//        log.info("1111---->微信返回的日志信息是：code:{}", weixinDataVo.getCode());
//        String openid = sessionInfo.getOpenid();
//        log.info("2222---->微信返回的日志信息是：openid:{}", openid);
//        if (com.alipay.api.internal.util.StringUtils.isEmpty(openid)) {
//            throw new KuangShenException(22009, "登录失败，尝试刷新重新扫码登录!!!");
//        }
//        weixinDataVo.setOpenid(openid);
//        WeiXinUser weiXinUser = weXinUserService.saveWeiXinUser(weixinDataVo);
//        log.info("3----------------保护用户信息是：{}",weiXinUser);
//        if(weiXinUser !=null) {
//            // 用户id一定要在生产token之前放进去
//            weixinDataVo.setUserId(weiXinUser.getId());
//            weixinDataVo.setNickName(weiXinUser.getUsername());
//    //        weixinDataVo.setRole(user.getRole());
//            // 生成token
//            String token = jwtService.tokenwx(weixinDataVo);
//            weixinDataVo.setToken(token);
//            return weixinDataVo;
//        }
//        return  null;
//    }
}